package com.dhj.jvmstudy.chapter05;

/**
 * 1、设置堆空间大小参数
 * -Xms 用来设置堆空间（年轻代+来年代）的初始内存大小
 *      -X 是jvm的运行参数
 *      ms 是memory start
 *
 * -Xmx 用来设置堆空间（年轻代+老年代）的最大内存大小
 *
 * 2、默认堆空间的大小
 * 初始内存大小：物理电脑内存大小/64
 * 最大内存大小：物理电脑内存大小/4
 *
 * 3、开发中建议将初始堆内存和最大堆内存设置成相同的值。
 *
 * 4、查看设置的参数：方式一：jps / jstate -gc 进程ID
 *                方式二：-XX:+PrintGCDetails
 *
 *
 * 配置官网地址：
 * https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
 */
public class HeapSpaceInitial {

    public static void main(String[] args) {
        // 返回Java虚拟机中堆内存总量
        long initialMemory = Runtime.getRuntime().totalMemory()/1024/1024;
        // 返回Java虚拟机试图使用的最大堆内存量
        long maxMemory = Runtime.getRuntime().maxMemory()/1024/1024;

        System.out.println("-Xms:"+initialMemory+"M");
        System.out.println("-Xmx:"+maxMemory+"M");

        /**
         * 计算出来的大小和实际使用之间有差距的原因？
         * 实际大小 = Ed(伊甸园区) + S0(幸存者0区) + S1(幸存者1区) + 老年代
         * 计算大小 = Ed(伊甸园区) + S0(幸存者0区) + 老年代
         * 之所以会有这样的区别是因为，由于GC的机制，S0和S1在同一时间点有且只能使用一个。
         */
        System.out.println("系统内存大小为："+initialMemory*64.0/1024+"G");
        System.out.println("系统内存大小为："+maxMemory*4.0/1024+"G");

    }


}
